﻿// Inner Fire 游戏引擎库
// ColliderInfo - 碰撞体配置
//
// Copyright (c) 2025 by 尔西大帝. All rights reserved.
//
// 所属层级：应用层（4）
// 做为碰撞体的配置。可以被一个对象所引用。
//
// Author: 尔西大帝
// Email: 2670613871@qq.com
// Created: 2025-07-23

#pragma once

#include <game/config/config_info.h>
#include <xml_reader.h>

namespace ifire::game {

enum class ShapeType {
  Particle, // 粒子
  Sphere,   // 球型
  Box,      // 正方形（使用OBB）
  Capsule   // 胶囊体（这个放在最后面，因为用于计算COUNT）
};

struct SphereInfo{
  float radius;

  SphereInfo() : radius(0.0f) {}
};

struct CapsuleInfo {
  float radius;
  float start;
  float end;

  CapsuleInfo() : radius(0.0f), start(0.0f), end(0.0f) {}
};

class ConfigManager;

class ColliderInfo : public ConfigInfo {
public:
  ColliderInfo(ConfigManager* manager, const ikit::XmlNode& node);
  ColliderInfo(const ColliderInfo& lhs) = delete;
  ColliderInfo& operator=(const ColliderInfo& lhs) = delete;
  ~ColliderInfo() = default;

  // 此Collider的类型
  ShapeType type;
  // 碰撞体的中心（通用）
  IVec3 center;
  // 球体的半径
  SphereInfo sphere;
  // Box的半径
  IVec3 box;
  // Capsule信息
  CapsuleInfo capsule;
};

using ColliderInfoPtr = std::unique_ptr<ColliderInfo>;

ShapeType ParseShapeType(ikit::sstr name);
ikit::sstr GetShapeTypeName(ShapeType type);

} // namespace ifire::game